package fi.uba.algocontrol.model.aviones;

import fi.uba.algocontrol.model.Sprite;
import fi.uba.algocontrol.model.Vector;
import fi.uba.algocontrol.model.pistas.Entrada;
import fi.uba.algocontrol.model.pistas.Pista;
import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;

public abstract class Avion implements ObjetoPosicionable, ObjetoVivo
{
    Vector  posicion = null;
    Integer velocidad = null;
    Vector  direccion = null;
    Sprite radioSprite = new Sprite(75,25);
    Boolean manipulado = false;
    Boolean chocado = false;

    public Avion (Vector posicion, Integer velocidad, Vector direccion)
    {
        this.posicion   = posicion;
        this.velocidad  = velocidad;
        this.direccion   = direccion;
    }

    public int getX()
    {
        return (int) this.posicion.getX();
    }

    public int getY()
    {
        return (int) this.posicion.getY();
    }

    public Integer getVelocidad() {
        return velocidad;
    }

    public Vector getPosicion() {
        return posicion;
    }

    public void rotar( Double angulo )
    {
        this.direccion.setX( Math.sin(angulo) );
        this.direccion.setY( Math.cos(angulo) );
    }

    public void mirarPunto( Vector punto )
    {
        this.direccion = punto.substract(this.posicion).getNormalizado();
    }

    public void moverse()
    {
        //se considera que el avion esta siempre en movimiento
        //su velocidd no varia a lo largo del nivel, es constante

        this.posicion.setX( this.posicion.getX() + this.direccion.getX()*this.velocidad );
        this.posicion.setY(this.posicion.getY() + this.direccion.getY() * this.velocidad);

    }

    public Boolean puedoDetenermeEnPista( Pista pista )
    {
        return pista.puedeAterrizarAvion(this);
    }

    public Sprite getRadioSprite()
    {
        return radioSprite;
    }

    public Vector getDireccion()
    {
        return direccion;
    }

    public void manipular()
    {
        this.manipulado = true;
    }

    public void soltar()
    {
        this.manipulado = false;
    }

    public Boolean manipulado()
    {
        return this.manipulado;
    }

    public Double getDistancia(ObjetoPosicionable objetoPosicionable)
    {
        return this.getPosicion().substract(new Vector(objetoPosicionable.getX(), objetoPosicionable.getY())).getNorma();
    }

    public void chocar(Avion otroAvion)
    {
        this.chocado = true;

        if (!otroAvion.chocado())
            otroAvion.chocar(this);
    }

    public Boolean chocado()
    {
        return this.chocado;
    }

    public void vivir()
    {
        this.moverse();
    }

}
